<?php
/**
 * 人类-使用 原型模式，并使用了一个额外的 暂住类
 * 2019年12月8日22:31:57
 * 主体类
 */
namespace Application\Common\Prototype;

class PeoplePrototype
{
    // 姓名
    private $name;
    // 性别
    private $sex;
    // 年龄
    private $age;
    // 暂住地 类
    private $current_stay;
    // 构造函数
    public function __construct()
    {
        $this -> current_stay = new CurrentStay();
    }
    // 设置姓名
    public function setName($name)
    {
        $this -> name = $name;
    }
    // 设置性别
    public function setSex($sex)
    {
        $this -> sex = $sex;
    }
    // 设置年龄
    public function setAge($age)
    {
        $this -> age = $age;
    }
    // 设置暂住地
    public function setCurrentStay($current_stay)
    {
        if(!is_array($current_stay)){
            return false;
        }
        foreach($current_stay as $k => $v){
            $this -> current_stay -> setStayInfo($k,$v);
        }
    }
    // 获取信息
    public function display()
    {
        return array(
            'name' => $this -> name,
            'sex' => $this -> sex,
            'age' => $this -> age,
            'current_stay' => $this -> current_stay -> display(),
        );
    }
    // 克隆本类时执行-克隆节点
    public function __clone()
    {
        $this -> current_stay = clone $this -> current_stay;
        // [关键]为了使暂住信息更具有定制与灵活性，需要编写赞助类；由于有了暂住类，当克隆人类时，暂住类仍然使用原来的对象，导致克隆后的人的暂住信息与原人的暂住信息互相干扰，所以在克隆本类时，需要一并克隆暂住类
    }
}
